home *** CD-ROM | disk | FTP | other *** search
/ Sprite 1984 - 1993 / Sprite 1984 - 1993.iso / src / boot / netBoot.new / dev / xt.c < prev    next >
C/C++ Source or Header  |  1990-12-19  |  3KB  |  170 lines

  1. #ifndef    M25
  2. #ifndef lint
  3. /* static    char sccsid[] = "@(#)xt.c 1.1 86/09/27 Copyr 1986 Sun Micro"; */
  4. #endif
  5.  
  6. /*
  7.  * Copyright (c) 1986 by Sun Microsystems, Inc.
  8.  */
  9.  
  10. /*
  11.  * Standalone driver for Xylogics 472 Tape Controller
  12.  */
  13.  
  14. #include "../dev/saio.h"
  15. #include "../dev/xycreg.h"
  16. #include "../dev/xtreg.h"
  17.  
  18.  
  19. #define NXTADDR    2
  20. unsigned long xtaddrs[] = { 0xEE60, 0xEE68 };
  21.  
  22. #define MAXXTREC    (20*1024)    /* max size tape rec allowed */
  23.  
  24. struct xtdma {
  25.     struct xtiopb    xtiopb;
  26.     char         xtblock[MAXXTREC];
  27. };
  28.  
  29. /* Define resources needed by this driver */
  30. struct devinfo xtinfo = {
  31.     sizeof(struct xydevice), sizeof (struct xtdma), 0,
  32.     NXTADDR, xtaddrs, MAP_MBIO,
  33. };
  34.  
  35. int    xtstrategy(), xtopen(), xtclose();
  36. extern int    nullsys(), ttboot();
  37.  
  38. struct boottab xtdriver = {
  39.     "xt",    nullsys, ttboot, xtopen, xtclose, xtstrategy,
  40.     "xt: Xylogics 472 tape",    &xtinfo,
  41. };
  42.  
  43. xtopen(sip)
  44.     register struct saioreq *sip;
  45. {
  46.     register skip;
  47.     register struct xydevice *xyaddr;
  48.  
  49.     xyaddr = (struct xydevice *) sip->si_devaddr;
  50.     if (pokec((char *)xyaddr, 0))
  51.         return (-1);
  52.     skip = xyaddr->xy_resupd;    /* controller reset */
  53.     sip->si_devdata = 0;        /* eof flag */
  54.     xtcmd(sip, XT_SEEK, XT_REW);
  55.     skip = sip->si_boff;
  56.     while (skip--) {
  57.         sip->si_cc = 0;
  58.         xtcmd(sip, XT_SEEK, XT_FILE);
  59.     }
  60.     return (0);
  61. }
  62.  
  63. xtclose(sip)
  64.     register struct saioreq *sip;
  65. {
  66.  
  67.     sip->si_devdata = 0;        /* eof flag */
  68.     xtcmd(sip, XT_SEEK, XT_REW);
  69. }
  70.  
  71. xtstrategy(sip, rw)
  72.     struct saioreq *sip;
  73.     int rw;
  74. {
  75.     int func = (rw == WRITE) ? XT_WRITE : XT_READ;
  76.     int n, occ, cc;
  77.     char *oma;
  78.  
  79.     cc = occ = sip->si_cc;
  80.     oma = sip->si_ma;
  81.  
  82.     if (sip->si_devdata) {        /* eof */
  83.         sip->si_devdata = 0;
  84.         return (0);
  85.     }
  86.     while (cc > 0) {
  87.         if (cc > MAXXTREC)
  88.             sip->si_cc = MAXXTREC;
  89.         else
  90.             sip->si_cc = cc;
  91.         n = xtcmd(sip, func, 0);
  92.         if (n <= 0)
  93.             break;
  94.         sip->si_ma += n;
  95.         cc -= n;
  96.     }
  97.     if (n == -1)
  98.         return (-1);
  99.     if (n == 0 && cc != occ)
  100.         sip->si_devdata = (char *)1;    /* EOF */
  101.     if (cc < 0)
  102.         cc = 0;
  103.     n = occ - cc;
  104.     sip->si_cc = occ;
  105.     sip->si_ma = oma;
  106.     return (n);
  107. }
  108.  
  109. xtcmd(sip, func, subfunc)
  110.     register struct saioreq *sip;
  111. {
  112.     register struct xtiopb *xt = &((struct xtdma *)sip->si_dmaaddr)->xtiopb;
  113.     register struct xydevice *xyaddr = (struct xydevice *)sip->si_devaddr;
  114.     char *xtbuf = ((struct xtdma *)sip->si_dmaaddr)->xtblock;
  115.     int err, t;
  116.  
  117.     bzero((char *)xt, sizeof (struct xtiopb));
  118.     xt->xt_reloc = 1;
  119.     xt->xt_autoup = 1;
  120.     xt->xt_cmd = func;
  121.     xt->xt_subfunc = subfunc;
  122.     xt->xt_unit = sip->si_unit & 3;
  123.     xt->xt_throttle = 5;
  124.     switch (func) {
  125.  
  126.     case XT_READ:
  127.         xt->xt_cnt = sip->si_cc;
  128.         xt->xt_swab = 1;
  129.         xt->xt_retry = 1;
  130.         break;
  131.  
  132.     case XT_WRITE:
  133.         xt->xt_cnt = sip->si_cc;
  134.         bcopy((char *)sip->si_ma, xtbuf, xt->xt_cnt);
  135.         xt->xt_swab = 1;
  136.         xt->xt_retry = 1;
  137.         break;
  138.  
  139.     default:
  140.         xt->xt_cnt = 1;
  141.         break;
  142.     }
  143.     xt->xt_bufoff = XYOFF(xtbuf);
  144.     xt->xt_bufrel = XYREL(xyaddr, xtbuf);
  145.  
  146.     t = XYREL(xyaddr, (char *)xt);
  147.     xyaddr->xy_iopbrel[0] = t >> 8;
  148.     xyaddr->xy_iopbrel[1] = t;
  149.     xyaddr->xy_iopboff[0] = ((int)xt) >> 8;
  150.     xyaddr->xy_iopboff[1] = (int)xt;
  151.     xyaddr->xy_csr = XY_GO;
  152.  
  153.     do {
  154.         DELAY(30);
  155.     } while (xyaddr->xy_csr & XY_BUSY);
  156.     err = xt->xt_errno;
  157.  
  158.     if (err != XTE_NOERROR && err != XTE_SHORTREC && err != XTE_LONGREC) {
  159.         if (err == XTE_EOF || err == XTE_EOT)
  160.             return (0);
  161.         /* Note: controller does retries for us */
  162.         printf("xt hard err %x\n", err);
  163.         return (-1);
  164.     }
  165.     if (func == XT_READ)
  166.         bcopy(xtbuf, (char *)sip->si_ma, xt->xt_acnt);
  167.     return (xt->xt_acnt);
  168. }
  169. #endif    M25
  170.